/**
 * @file user_config.h
 * @brief MIDI 驱动项目用户配置
 * @date 2025-11-01
 */

#ifndef __USER_CONFIG_H__
#define __USER_CONFIG_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdbool.h>

/* 功能配置宏定义 */



#define DEBUG_MODE                              0   /* 0: 正常模式，1: 调试模式 */

#if (DEBUG_MODE == 1)
#define FEATURE_IWDG_ENABLE                     0   /* 0: 禁用，1: 启用看门狗 */
#define FEATURE_DEBUG_BYPASS_BOARD_MANAGER      0   /* 0: 正常板号管理，1: 调试模式跳过板号分配(保留SWD) */
#define FEATURE_DEBUG_DEFAULT_BOARD_ID          1   /* 调试模式默认板号(1-11) */
#define FEATURE_DEBUG_DISABLE_AD_DET_INPUT_PA13 1   /* 0: PA8 输出，1: PA13输出， 板号管理输出才有用 */
#define FEATURE_DEBUG_CAN_PERIODIC_TEST         0   /* 0: 禁用，1: 周期性发送0xBF测试CAN(仅调试用) */
#define FEATURE_DEBUG_CAN_TEST_INTERVAL_MS      1000 /* CAN测试信号发送间隔(ms) */
#endif

/* MIDI 协议版本定义 */
#define MIDI_VERSION_1_0            1       /* MIDI 1.0 */
#define MIDI_VERSION_2_0            2       /* MIDI 2.0 */

/* Velocity 精度定义 */
#define VELOCITY_BITS_7             7       /* 7位精度 (0-127) */
#define VELOCITY_BITS_16            16      /* 16位精度 (0-65535) */

/* MIDI 琴键打击时序配置 */
/* 这些值可根据不同钢琴特性由客户调整 */

/* 阶段1: 全功率输出 */
#define CONFIG_TIME1_DUTY_PERCENT       100     /* 100% 全功率占空比 */
#define CONFIG_TIME1_DURATION_MS        40      /* 40ms 持续时间（可调范围 10-40ms） */

/* 阶段2: 基于力度的过渡 */
#define CONFIG_TIME2_DURATION_BASE_MS   40      /* 基础持续时间：40ms 默认时间 */
#define CONFIG_TIME2_VELOCITY_DIVISOR   2       /* 力度除数：持续时间 = 力度 / 除数 
                                                   * 力度越大，低电平时长越短
                                                   * 力度7F(127)时，直接输出高电平，时长为40ms
                                                   * 力度小于设定值时，输出低电平，时长 = 力度/2 */

/* 阶段3: 悬停占空比 */
#define CONFIG_TIME3_1_DURATION_MS      100     /* 100ms 第一悬停持续时间 */
#define CONFIG_TIME3_2_DURATION_MS      0       /* 0 = 持续直到停止命令 */

/* 阶段3 占空比默认值（百分比，用于设定模式） */
#define CONFIG_TIME3_1_DUTY_DEFAULT     30      /* 阶段3-1 默认占空比 30% */
#define CONFIG_TIME3_2_DUTY_DEFAULT     23      /* 阶段3-2 默认占空比 23% */

/* 自动关闭安全超时 */
#define CONFIG_KEY_TIMEOUT_MS           7000    /* 7 秒自动关闭安全保护 */

/* 时序调整范围 */
#define CONFIG_TIME1_MIN_MS             10      /* 最小 Time1 持续时间 */
#define CONFIG_TIME1_MAX_MS             40      /* 最大 Time1 持续时间 */
#define CONFIG_TIME2_MAX_MS             63      /* 最大 Time2 持续时间（力度/2） */

/* 全局配置结构体定义 --------------------------------------------------*/

/**
 * @brief 全局用户配置结构体
 */
typedef struct
{
    /* 板级配置 */
    uint8_t  board_id;                  /* 板号 (1-11) */
    bool     board_id_assigned;         /* 板号是否已分配 */

    /* MIDI 协议配置 */
    uint8_t  midi_version;              /* MIDI 版本: 1=MIDI1.0, 2=MIDI2.0 */
    uint8_t  velocity_bits;             /* Velocity 精度: 7 或 16 */
    uint32_t velocity_max;              /* Velocity 最大值: 127 或 65535 */

    /* PWM 精度配置 */
    uint16_t pwm_resolution;            /* PWM 分辨率 (计算值, 如 2181) */
    uint16_t pwm_duty_max;              /* PWM 最大占空比值 (根据精度模式) */

    /* 时序配置（可通过 B0 0E xx 设定） */
    uint32_t time1_ms;                  /* 阶段1 全功率时长 (1-127ms, 默认40ms) */
    uint32_t time2_ms;                  /* 阶段2 基础时长 (1-127ms, 默认40ms) */
    uint16_t time3_1_duty;              /* 阶段3-1 占空比 (20-40%, velocity 1-127映射) */
    uint16_t time3_2_duty;              /* 阶段3-2 占空比 (16-30%, velocity 1-127映射) */
    uint32_t time3_1_ms;                /* 阶段3-1 时长 (100ms) */
    uint32_t timeout_ms;                /* 自动关闭超时 (7000ms) */

    /* 设定模式状态 */
    uint8_t  setup_mode;                /* 当前设定模式: 0=无, 1-4=TIME1/2/3_1/3_2 */

} user_config_t;


/* 板级特定占空比（这些在 drv_pwm.h 中定义） */
/* 客户如有需要可在 drv_pwm.h 中修改这些值 */

/* 全局配置变量声明 --------------------------------------------------------*/
extern user_config_t user_config;

/* 配置管理接口 ------------------------------------------------------------*/

/**
 * @brief 初始化用户配置 (加载默认值)
 */
void user_config_init(void);

/**
 * @brief 设置板号
 * @param board_number 板号 (1-11)
 * @retval 0 成功，-1 失败
 */
int user_config_set_board_number(uint8_t board_number);

/**
 * @brief 获取板号
 * @retval 板号 (1-11)，0表示未分配
 */
uint8_t user_config_get_board_number(void);

/**
 * @brief 检查板号是否已分配
 * @retval true 已分配，false 未分配
 */
bool user_config_is_board_number_assigned(void);

/**
 * @brief 重置板号状态
 */
void user_config_reset_board_number(void);

/**
 * @brief 设置 MIDI 协议版本
 * @param version MIDI_VERSION_1_0 或 MIDI_VERSION_2_0
 */
void user_config_set_midi_version(uint8_t version);

/**
 * @brief 获取 MIDI 协议版本
 * @retval MIDI 版本 (1 或 2)
 */
uint8_t user_config_get_midi_version(void);

/**
 * @brief 获取当前 velocity 精度
 * @retval velocity 位数 (7 或 16)
 */
uint8_t user_config_get_velocity_bits(void);

/**
 * @brief 获取当前 velocity 最大值
 * @retval velocity 最大值 (127 或 65535)
 */
uint32_t user_config_get_velocity_max(void);

/**
 * @brief 获取 PWM 硬件分辨率
 * @retval PWM 分辨率 (如 2181)
 */
uint16_t user_config_get_pwm_resolution(void);

#ifdef __cplusplus
}
#endif

#endif /* __USER_CONFIG_H__ */

/******************************** 文件结束 *********************************/
